package org.godotengine.godot; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import com.google.android.gms.ads.*; import android.app.Activity; import android.widget.FrameLayout; import android.view.ViewGroup.LayoutParams; import android.provider.Settings; import android.graphics.Color; import android.util.Log; import android.view.Gravity; import android.view.View; //import android.widget.LinearLayout; //import android.widget.RelativeLayout; //import android.os.Bundle; public class GodotAdMob extends Godot.SingletonBase { private Activity activity = null; private AdView adView = null; private AdView adViewW = null; private AdView adViewH = null; private AdRequest request = null; private AdListener adListener = null; private boolean isRealAd = false; private boolean isAdOnTop = true; private String adUnitID = null; private boolean isShowBanner = false; private boolean isShowBannerArg = false; public int getAdWidth() { return AdSize.SMART_BANNER.getWidthInPixels(activity); } public int getAdHeight() { return AdSize.SMART_BANNER.getHeightInPixels(activity); } static public Godot.SingletonBase initialize(Activity p_activity) { return new GodotAdMob(p_activity); } public void init(boolean isReal, boolean isTop, String id) { isRealAd = isReal; isAdOnTop = isTop; adUnitID = id; Log.d("godot", "AdMob: init"); activity.runOnUiThread(new Runnable() { @Override public void run() { //if(android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.JELLY_BEAN) //{ // activity.getWindow().setFlags(android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, // android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); //} AdRequest.Builder adBuilder = new AdRequest.Builder(); adBuilder.tagForChildDirectedTreatment(true); if(!isRealAd) { adBuilder.addTestDevice(AdRequest.DEVICE_ID_EMULATOR); adBuilder.addTestDevice(getAdmobDeviceId()); } request = adBuilder.build(); adListener = new AdListener() { @Override public void onAdLoaded() { Log.d("godot", "AdMob: OnAdLoaded"); } @Override public void onAdFailedToLoad(int errorCode) { String str; switch(errorCode) { case AdRequest.ERROR_CODE_INTERNAL_ERROR: str = "ERROR_CODE_INTERNAL_ERROR"; break; case AdRequest.ERROR_CODE_INVALID_REQUEST: str = "ERROR_CODE_INVALID_REQUEST"; break; case AdRequest.ERROR_CODE_NETWORK_ERROR: str = "ERROR_CODE_NETWORK_ERROR"; break; case AdRequest.ERROR_CODE_NO_FILL: str = "ERROR_CODE_NO_FILL"; break; default: str = "Code: " + errorCode; break; } Log.w("godot", "AdMob: onAdFailedToLoad->" + str); } }; setBannerView(); } }); } public void showBanner(boolean isShow) { if(isShowBanner == isShow) return; isShowBannerArg = isShow; activity.runOnUiThread(new Runnable() { @Override public void run() { if(isShowBanner == isShowBannerArg) return; isShowBanner = isShowBannerArg; setShowBanner(isShowBanner); } }); } public void resize(boolean isTop) { isAdOnTop = isTop; activity.runOnUiThread(new Runnable() { @Override public void run() { setBannerView(); } }); } private void setShowBanner(boolean isShow) { if(isShow) { //adView.loadAd(request); adView.setVisibility(View.VISIBLE); adView.resume(); Log.d("godot", "AdMob: Show Banner"); } else { adView.setVisibility(View.GONE); //adView.destroy(); adView.pause(); Log.d("godot", "AdMob: Hide Banner"); } } private AdView setAdView() { int w = activity.getWindow().getDecorView().getWidth(); int h = activity.getWindow().getDecorView().getHeight(); boolean isCreate = true; if(w > h) // Landscape { if(null != adViewW) { isCreate = false; adView = adViewW; } } else // Portrait { if(null != adViewH) { isCreate = false; adView = adViewH; } } if(isCreate) { adView = new AdView(activity); adView.setBackgroundColor(Color.TRANSPARENT); adView.setAdUnitId(adUnitID); adView.setAdSize(AdSize.SMART_BANNER); adView.setAdListener(adListener); adView.loadAd(request); setShowBanner(false); if(w > h) adViewW = adView; else adViewH = adView; //Log.d("godot", "AdMob: View is hardware = " + adView.isHardwareAccelerated()); } return adView; } private void setBannerView() { FrameLayout layout = ((Godot)activity).layout; FrameLayout.LayoutParams adParams = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT); if(isAdOnTop) adParams.gravity = Gravity.TOP; else adParams.gravity = Gravity.BOTTOM; if(null != adView) { setShowBanner(false); layout.removeView(adView); } setAdView(); layout.addView(adView, adParams); setShowBanner(isShowBanner); } /*@Override protected void onMainDestroy() { Log.d("godot", "AdMob: Destroy"); }*/ private String md5(final String s) { try { // Create MD5 Hash MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(s.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); for(int i=0; i<messageDigest.length; i++) { String h = Integer.toHexString(0xFF & messageDigest[i]); while (h.length() < 2) { h = "0" + h; } hexString.append(h); } return hexString.toString(); } catch(NoSuchAlgorithmException e) { //Logger.logStackTrace(TAG,e); } return ""; } private String getAdmobDeviceId() { String android_id = Settings.Secure.getString(activity.getContentResolver(), Settings.Secure.ANDROID_ID); String deviceId = md5(android_id).toUpperCase(); return deviceId; } public GodotAdMob(Activity p_activity) { registerClass("AdMob", new String[] { "init", "showBanner", "getAdWidth", "getAdHeight", "resize" }); activity = p_activity; } }